package cn.com.yang.server.jetty;

import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.server.handler.DefaultHandler;
import org.eclipse.jetty.server.handler.HandlerList;
import org.eclipse.jetty.server.handler.ResourceHandler;

/**
 * 简单Jetty文件服务器
 * TODO
 * @author yangyijin
 * @since 2023年5月18日-上午9:38:46
 */
public class JettyFileServer {
	public static void main(String[] args) throws Exception {
		//1.创建一个8080端口，端口设置为0，server将分配一个随机可用端口
		//-- 此处随机相当于Socket的随机端口，也就是说，Jetty Sercer 封装了Socket
		//-- Jetty在 9.4版本使用了NIO,也就是说使用了ServerSocketChannel
		// ServerSocketChannel使用的是selector模式，选择性处理感兴趣的事件
		//（之所以会被叫做感兴趣，是因为注册事件的方法名带了interest【兴趣】,本质上的事件包括READ\WRITE\CONNECT）
		Server server = new Server();
		// HTTP connector
		ServerConnector http = new ServerConnector(server);
		http.setHost("localhost");
		http.setPort(8080);
		http.setIdleTimeout(30000);
		server.addConnector(http);
		// 2.创建ResourceHandler,因为它实际处理指定文件请求的对象
		ResourceHandler resourceHandler = new ResourceHandler();
		// 3.设置文件服务器的资源根目录，当前目录
		resourceHandler.setResourceBase(".");
		resourceHandler.setDirectoriesListed(true);
		resourceHandler.setWelcomeFiles(new String[] {"index.html"});
		// 4.将resourceHandler添加至server
		HandlerList handlerList = new HandlerList();
		handlerList.setHandlers(new Handler[] {resourceHandler,new DefaultHandler()});
		server.setHandler(handlerList);
		//5.启动服务器
		server.start();
		//通过使用server.join(),处理线程等待线程处理结束
		server.join();
	}
}
